#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Pinball
# beenden: pkill -9 file.py
# Using Game-Loop, http://codentronix.com/2011/04/20/a-fast-introduction-to-pygame/
# Einfallswinkel berechnen, http://wiki.delphigl.com/index.php/Tutorial_Kollision1

import sys
import time
import random
import pygame
import numpy as np
import math

ScreenW=30
ScreenH=20
Zoom=20
RasterColor=50
HindernissColor=100
ObjektX=11 # Ball
ObjektY=7
Richtung=45 # Ball
xPos=0 # Mouse-Cursor
yPos=0
Taste=0
Energie=0
PaddelWinkel=0
PaddelX=20
PaddelY=10
PaddelLaenge=8

# ------------------------------------------
def Update():
  global ObjektX, ObjektY, Taste, PaddelWinkel, Richtung # Zugriff auf Variable erhalten

  WinkelAlt=PaddelWinkel
  if Taste==1:
    print "Taste links"
    PaddelWinkel-=22.5
  if Taste==2:
    print "Taste rechts"
    PaddelWinkel+=22.5

  # alten Paddel löschen
  for i in range(0, PaddelLaenge):
    x=int(round(PaddelX+i*math.sin(WinkelAlt*math.pi/180)))
    y=int(round(PaddelY-i*math.cos(WinkelAlt*math.pi/180)))
    Bildschirm[x,y]=0

  # neuen Paddel einzeichnen
  for i in range(0, PaddelLaenge):
    x=int(round(PaddelX+i*math.sin(PaddelWinkel*math.pi/180)))
    y=int(round(PaddelY-i*math.cos(PaddelWinkel*math.pi/180)))
    Bildschirm[x,y]=1

  # Ball bewegen
  Abstand=1
  x=int(round(ObjektX+Abstand*math.sin(Richtung*math.pi/180)))
  y=int(round(ObjektY-Abstand*math.cos(Richtung*math.pi/180)))
  if(Bildschirm[x,y]==1):
    # Hinderniss erreicht, Einschlagwinkel ermitteln
    Einschlagwinkel=0
    if(Bildschirm[x+1,y]==1):
      Einschlagwinkel=90
    if(Bildschirm[x,y+1]==1):
      Einschlagwinkel=180
    Richtung=2*Einschlagwinkel-Richtung
  else:
    ObjektX=x
    ObjektY=y



# ------------------------------------------
def Ausgabe():

  window.fill((0, 0, 0)) # Bildschirm loeschen

  # Raster zeichnen
  for x in range(0, ScreenW):
    pygame.draw.line(window, (RasterColor,RasterColor,RasterColor), (x*Zoom, 0), (x*Zoom, ScreenW*Zoom))
  for y in range(0, ScreenH):
    pygame.draw.line(window, (RasterColor,RasterColor,RasterColor), (0, y*Zoom), (ScreenW*Zoom, y*Zoom))

  # Bildschirm ausgeben
  for x in range(0, ScreenW):
    for y in range(0, ScreenH):
      if Bildschirm[x,y] == 1: # Hinderniss
        pygame.draw.rect(window, (HindernissColor,HindernissColor,HindernissColor), (x*Zoom,y*Zoom,1*Zoom,1*Zoom))

  # Spieler ausgeben
  pygame.draw.circle(window, (HindernissColor,2*HindernissColor,HindernissColor), (ObjektX*Zoom+Zoom/2,ObjektY*Zoom+Zoom/2),10)

  # Energielevel
  myfont = pygame.font.SysFont("freesans", Zoom)
  label = myfont.render("Energie: "+str(Energie), 1, (255,255,255))
  window.blit(label, (50,0))

  # Ballposition
  myfont = pygame.font.SysFont("freesans", Zoom)
  label = myfont.render("x: "+str(ObjektX)+" y: "+str(ObjektY), 1, (255,255,255))
  window.blit(label, (200,0))
  
  pygame.display.flip()

# end def Ausgabe():





# ------------------------------------------
# M A I N
# ------------------------------------------
# Array 
Bildschirm=np.zeros((ScreenW,ScreenH),dtype=int) # initialisieren mit 0

# Hindernisse festlegen

# Hinderniss am Boden
for x in range(1, ScreenW-1):
  Bildschirm[x,ScreenH-2]=1
# Hinderniss Decke
for x in range(1, ScreenW-1):
  Bildschirm[x,1]=1
# Hinderniss linke Wand
for x in range(1, ScreenH-1):
  Bildschirm[1,x]=1
# Hinderniss rechte Wand
for x in range(1, ScreenH-1):
  Bildschirm[ScreenW-2,x]=1

#create the screen
pygame.init()
window = pygame.display.set_mode((ScreenW*Zoom,ScreenH*Zoom))


# time.sleep(20)

#input handling
clock = pygame.time.Clock()
while True: 
#  time.sleep(0.05) # um CPU Auslastung zu senken
  clock.tick(50) # mit 50 fps arbeiten
  Ausgabe()
  Update()  
  Taste=0 # Taste loeschen
  Taste=random.randint(1,50) # Taste Zufall

  for event in pygame.event.get(): 
    if event.type == pygame.QUIT: 
      sys.exit(0) 
    elif event.type == pygame.KEYDOWN:
      if event.key == pygame.K_LEFT:   
        Taste=1
      elif event.key == pygame.K_RIGHT:
        Taste=2
      elif event.key == pygame.K_UP:
        Taste=3
      elif event.key == pygame.K_DOWN:
        Taste=4
 # Taste=random.randint(1,4) # Zufallstaste
